<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<title>firstworks   基于web的应用程序数据库访问介绍</title>
<link href="css/styles.css" rel="stylesheet">
</head>
<body>

<span class="heading1">基于web的应用程序数据库访问介绍</span><br>

<p>
现在，很少能见到一个本质上是基于web的应用程序不去访问某种类型的数据库。
这里讨论（理论上比较细致地）了现有的各种用于开发基于web的应用程序工具，
以及一个开发人员可以选择的数据库连接方式。
</p>

<span class="heading1">“数据库”的定义</span><br>

<p>
首先，有一个问题需要回答，那就是当你使用“数据库”这个词时，你想表达的意思是什么？
这个问题看起来好像很弱智(like a no-brainer)，但是我已经就“数据库”这个词的含义跟许多人争论了很久。
为了能够进行下面的讨论，数据库的定义是一个应用程序能访问的，对于信息的有机存储器。
这是一个很一般的定义，在网络上还有其他定义，但是这就是这里所讨论的“数据库”。
</p>

<span class="heading1">数据库的不同类型</span><br>

<p>
有很多不同种类的数据库，今天，层次型和关系型数据库可能是一个开发者经常会涉及到的种类。
</p>

<p>
层次型数据库是由树（实际上是一个无回路或者有限循环图）的节点构成的，每一个节点通过其他节点指向其的路径进行引用，
单个节点包含一系列信息，但是树形结构就是数据库类型的定义。典型的层次型数据库有LDAP数据库和文件系统。
没错，文件系统的确是一个数据库，层次型的！
</p>

<p>
关系型数据库是一些二维表的集合，每一个表包含若干列，若干行。 行和列交叉的域叫做属性，列拥有数据类型，
例如字符，数字，布尔，通常也会有一个数据的长度。让整个数据之间具有关系的，
是将一个表的属性与另外一个表的属性进行关联，从而使得两个表之间产生关系而实现的。
</p>

<span class="heading1">关系型数据库</span><br>

<p>实际当中有很多种关系型数据库</p>

<p>
结构化查询语言(SQL, Structure Query Language)数据库可能是最受欢迎的，在一个SQL数据库中，客户端提交一些查询给
关系型数据库管理系统(RDBMS, Relational Database Management System), RDBMS会
返回给客户端查询的结果集。SQL数据库的例子有开源的MySQL 数据库和商业产品，像Oracle，
Sybase和Microsoft SQL Server。
</p>

<p>
还有一种关系型数据库是xBase或者BerkeleyDB风格的数据库，xBase这个词是从dBase I、II、III、IV
和FoxBase的产品而衍生出来的。对于这种数据库，表示存储在单独的文件里，提供直接访问存储在文件中的
行和列的方法，并没有提供高级的查询语言。
</p>

<p>Between xBase and SQL databases lie databases like Microsoft Access and
FoxPro.  They both provide both direct table access methods and a high level 
query language, though not SQL proper.
介于xBase和SQL数据库这两种类型的关系型数据库之间的是微软的Access和Foxpro，他们同时提供直接访问
表的方法和高级查询语言（尽管不是合适SQL）。
</p>

<p>
纯文本<font color="Red">(Flat file, A "flat file" is a plain text or mixed text and binary file 
which usually contains one record per line[2] or 'physical' record (example 
on disc or tape).)</font>数据库是另外一种关系型数据库，这种数据库中，数据以某种可读的
形式存储，可以直接用文本编辑器打开和修改，他们经常用于存储小规模的数据。尽管文件格式多种
多样，列通常用逗号引用，或者干脆不引用，使用tab分离各个列，有的情况下，列使用固定长度并且用
空格填充，每一行通常用回车分隔。这种数据库主要用于特殊的软件包，使用低级的文件操作指令或者
通过软件包提供的API去访问。
</p>

<span class="heading1">事务型数据库</span><br>

<p>
在RDBMS的世界，有两种分类：事务型和非事务型。一个事务型的RDBMS维护着独立的会话，提供
提交(commit)和回退(rollback)方法，一个会话造成的改变在提交(commit)之前，对于其他的会话
是不可见的，改变在提交前也可以回退，在回退是，改变之前的数据库状态会被恢复。绝大多数久经考验
的商业RDBMS是事务型的，而低端的商业及免费数据库不是（译者：例如Mysql（MYISAM））。
</p>

<span class="heading1">访问数据库</span><br>

<p>“我如何通过web从我的数据库获取数据”</p>

<p>那可是个炙手可热的问题，有很多答案。</p>

<p>
由于彼此之间存在着这样或者那样的约束，决定一个解决方案的重要因素是操作系统，数据库以及开发工具的选择。
另外一个重要因素是数据库信息需要显示的方式？
</p>

<p>
如果应用程序仅仅是要从一个不常更新的数据库中显示一些信息，那么生成一个web可展示的报告是
一种高效的解决方案。商业报告工具例如Crystal Reports和Oracle Reports能直接生成HTML格式
的报表。这些工具只能运行于Microsoft Windows系统之上，尽管其他平台之上也有类似的工具。
大多数据库提供了底层脚本工具用于执行查询，同时，可以利用其中一种工具或者人为定制的html模板文件
定期的生成展示报表。对于那些没有提供脚本查询工具的数据库，可以撰写多种编程语言调用API来实现
相同的最终结果。
</p>

<p>
使用一个web应用服务器，是最简单的构建动态、数据库驱动的应用程序的方法。大多数这样的程序与
一系列关系型数据库相连，一个生成网页的工具，通过简单的拖拽方式去访问数据库对象。web应用服务器
在功能上、可扩展性、可延伸性以及可以连接的数据库这些方面通常会受操作系统的一些限制。
</p>

<p>
Microsoft Visual InterDev比较容易上手，它并不是一个web应用服务器，而是一个基于web的应用
程序开发系统。在InterDev中，关系型数据库对象可以被拖拽至网页上，页面是ASP，数据库对象必须
通过ODBC去访问。ASP极易扩展，ODBC可以连接多种关系型数据库，而最终应用程序极有可能必须部署在
Microsoft的Windows操作系统的IIS上。
</p>

<p>
Oracle提供了一个独特的解决方案，在Oracle 8i及更高的版本中，RDBMS依附于一个外部的Web服务器，
例如Apache、Netscape、Microsoft IIS以及其他类似的服务器应用程序。应用程序作为PL/SQL的存储
过程在数据库中驻留和执行。
</p>

<p>
大多数的非拖拽解决方案需要一个API进行编程，比较流行的用于撰写Web应用程序的编程语言有PHP，
Perl，Python，C/C++及Java。
</p>

<p>
PHP提供了很多方法用于访问大多数的数据库，包括ODBC，LDAP，BerkeleyDB，xBase及很多SQl数据库，
同时还提供了用于访问文件系统的方法。
</p>

<p>
Perl提供了DBI模块，可以用于访问任何现存的SQL数据库，DBI模块提供给perl这些数据库API调用
的接口，同时也有访问LDAP和文件系统的模块。
</p>

<p>Python 具有与Perl类似的模块。</p>

<p>
数据库的API大多数都是以C库的形式提供，可以直接使用C、C++或Serverlet去访问，另外，在很多平台上
可以使用ODBC API替代特定的数据库API。 xBase数据库可以通过Sequiter CodeBASE或者免费库访问。
BerkeleyDB数据库的开发库随Unix发行。各种各样的免费LDAP API作为C库可以使用。
</p>

<p>
为了使用C或者C++的程序访问Oracle数据库，Pro C是另外一种选择，它是一种预处理器，把嵌入式SQL
解释成Oracle API调用的方式。
</p>

<p>
Java提供了JDBC，类似ODBC能够连接多种关系型数据库。另外，一些商业性数据库的厂商在提供C API
的同时也提供了Java API。
</p>

<span class="heading1">不通过API访问数据库</span><br>

<p>
有的时候，需要使用一种本身没有数据库API的编程语言撰写WEB应用程序。大多数语言既可以执行
DLL，也可以执行COM对象方法，或者使用命令行调用。C可以撰写共享对象库，下面列出的编程语言
可以撰写命令行程序。尽管需要做一些（可能会有很多）额外的工作，但是总是有办法不通过API访问
数据库。
</p>

<p>
一个更加局限的问题是平台的问题，数据库API仅仅提供给一些有限数目的平台，某些数据库只有支持使用intel
硬件平台的Windows操作系统，某些同时支持微软和unix，但是有一些只支持unix。MacOS又怎么样呢？
PowerPC Linux呢？Alpha平台上的微软NT系统呢？如果数据库API不支持某个平台，那么某个使用
它的编程语言必然也不支持。一个使用并不存在的接口调用的程序是不能够运行或者被编译的。
</p>

<p>有一些对于“不支持我的平台的API”问题的解决方案</p>

<p>
如果你需要从Unix访问微软的SQL Server：SQL Server和Sbase都可以使用TDS(Tabular Data Stream)协议
，所以你只要在Unix平台上使用ODBC，Sybase的驱动便可以起作用。不幸的是，SQL Server 7使用一个轻量级
的修改过的协议，幸运的是，FreeTDS项目提供了能够工作在Sybase和微软SQL Server所有发行版本之上的API。
</p>

<p>
分布式提供了一个一般性的解决方案。远程调用(RPC, Remote Procedure Call)，Corba， DCOM(Distribute
 COM)及Java RMI(Remote Method Invocation)允许一个程序调用其他计算机上的方法来从本地获取
 结果。 当你在某地有另外一台机器能够使数据库工作的话，那这种方案将非常有用。 C和C++在
 绝大多数平台上支持RPC和Corba，在部分平台（包括Unix，但是确实开销很大）上支持DCOM。Java支持RMI。
 Perl和Python支持这些方法中的一部分，而且能够通过模块扩展从而支持更多。
</p>

<p><b>SQL Relay</b> 
提供另外一种使用不支持平台的软件访问多种不同数据库的解决方案。<b>SQL Relay</b>API可以
在多种不能直接运行的服务器上编译，该服务器运行在一个特别的服务器用于在处于两端的客户端和数据库之间建立网络链接。<b>SQL Relay</b>提供了一种类似分布式处理的服务，不过只能通过一种特殊的接口
来实现。</p>

<p>
另外一种解决方案是通过在一个远程机器（数据库API在此能够起到作用）上写命令行程序来
执行数据库API调用，并且能把结果返回到标准输出或者一个共享文件。 这些命令行程序能够
在远程使用rcmd或者rexec执行。 大多数Unix系统支持rcmd和rexec，并且在其他系统上也是一个
免费程序。</p>

<span class="heading1">性能问题和解决（None-Issues）</span><br>

<p>
某些RDMS，尤其是事务性SQL RDBMS需要一个比较耗时的登录过程，可能是由于当初在设计时沿用了
旧的C/S模式。在这种模式下，客户端登录进一个早上启动的RDBMS，一整天使用同样的连接方式不停地
访问数据库。要么到这一天结束用户关闭，客户端才会注销掉这个链接，要么就知道第二天也不需要登录
。只要客户端不频繁的登录，并且在非重要的时间登录，登录所花费的时间可以忽略不计。 另外一个需要
考虑的是RDBMS会认为处理登录比处理当前的查询优先级要低，或者他认为登录在一个事务型的RDBMS是一个
开销较大，因为存在着session/commit/rollback的问题。无论如何，基于web的应用程序可能在每个
页面加载的时候都会进行一次登录RDBMS的操作，而这些操作可能会造成应用程序不可忍受的速度下降。</p>

<p>
有一些数据库是很早以前设计的，并且没有RDBMS，事务或者其他功能。这些包括文件系统，BDB和xBase
数据库。由于程序员必须要使用低级的命令去访问数据库，数据库操作需要进行高度的优化。大多数最重要的
性能问题都是在使用这些数据库时使用简单的优化访问算法造成的，因为相比较高度优化的算法，他们更容易
执行。</p>

<p>
LDAP数据库具有高访问性能和低更新性能的设计特点。所有对于一个LDAP数据库的访问都经过速度优化，
包括登录。</p>

<span class="heading1">性能解决方案</span><br>

<p>
为了解决基于web的应用程序数据库访问性能方面的问题，开发人员已经提出了一些解决方案</p>

<p>
一种解决办法是调整数据库，让登录变得更快，起初，这看起来像是一个不错的解决方案，
但是不可避免的，带来的后果是会对数据库其他的活动会造成影响。</p>

<p>
另外一种解决方案是把web服务器直接与RDBMS整合到一起。Oracle 8I以及更高的版本就是这么做的。
这种方式依然具有局限性，大部分平台都支持但是可能就是不支持特殊的平台，PL/SQL不见得速度快，
而且Oracle对于一些追逐者来说太贵了。</p>

<p>
第三个和最受欢迎的解决方案是维护一个RDBMS连接池并且为需要的执行连接预先“借出”一些连接，
web应用程序在启动的时候就进行登录，并且允许应用程序县城通过这些开放的链接来访问数据库。
当以一个Apache模块来运行，PHP具有类似的能力，使用FastCGI库创建一些持续的CGI链接来做同样的
事情。<b>SQL Relay</b>提供一种解决方案用于访问多种数据库。 还有一些其他的例子，但是那些很
块就能想到。 这个解决方案允许动态的规模适应性，当应用程序的这种需求增长时，就需要很多即时可用的
数据库连接。 另外，当新链接启动或者旧的完成它们当前的工作时应用程序便停止运作。如果想完美无暇
地使用这种解决方案，必须能够事先预测应用程序的负载状况。</p>

<span class="heading1">接下来...</span><br>

<p>
希望这个讨论能够让一些不熟悉的话题或者堵在某个熟悉话题前的人乍现灵光，如果想获得更多关于
<b>SQL Relay</b>的东西，请点击你的浏览器“后退”按钮，继续进行列表后面的讨论：
<b>SQL Relay的介绍</b></p>

</body>
</html>
